简体   繁体   中英

Uncompilable source code - unreported exception java.lang.Exception; must be caught or declared to be thrown

I'm new in JAVA just learned a basics of it and now I'm trying to learn some advance JAVA I don't know its advance or not but what I'm trying to do is when I click on Search button I'll send 1 http call and when I remove http request code or when I remove search button code then its working individually but not together

Here's my code :

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package google;
import java.io.*;
import java.net.*;
import java.awt.event.*;
import javax.swing.*;
/**
 *
 * @author user
 */

public class Google extends JFrame {

    private final String USER_AGENT = "Mozilla/5.0";

    public Google() {
       initUI();
    }

    private void callUrl() throws Exception {

        String url = "http://www.google.com/search?q=mkyong";

        URL obj = new URL(url);
        HttpURLConnection con = (HttpURLConnection) obj.openConnection();

        // optional default is GET
        con.setRequestMethod("GET");

        //add request header
        con.setRequestProperty("User-Agent", USER_AGENT);

        int responseCode = con.getResponseCode();
        System.out.println("\nSending 'GET' request to URL : " + url);
        System.out.println("Response Code : " + responseCode);

        BufferedReader in = new BufferedReader(
                new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();

        //print result
        System.out.println(response.toString());

    }

    private void initUI() {

       JPanel panel = new JPanel();
       getContentPane().add(panel);

       panel.setLayout(null);

       JButton searchButton = new JButton("Search");
       searchButton.setBounds(50, 60, 80, 30);

       searchButton.addActionListener(new ActionListener() {
           @Override
           public void actionPerformed(ActionEvent event)  {
               callUrl();
          }
       });

       panel.add(searchButton);

       setTitle("Search");
       setSize(300, 200);
       setLocationRelativeTo(null);
       setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void main(String[] args) throws Exception {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                Google ex = new Google();
                ex.setVisible(true);
            }
        });
    }

}

Sorry if this question is already exists I searched a lot but didn't get proper solution. Thanks

Error :

Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: Uncompilable source code - unreported exception java.lang.Exception; must be caught or declared to be thrown
    at google.Google$1.actionPerformed(Google.java:70)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6505)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
    at java.awt.Component.processEvent(Component.java:6270)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4861)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:708)
    at java.awt.EventQueue$4.run(EventQueue.java:706)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

This is not quite specific to your question, but it will help you in understanding about the exception handling in java.

There are two types of exceptions

  • Checked exceptions
  • Unchecked exceptions

Checked exceptions should be handled in code, that means you either need to handle with in the method or throw the exceptions so that the caller of the method will take care.

To catch the exception you need to use try and catch . If you don't want to handle the exception you can declare your method as throws SomeException so that caller would handle.

For Example:

public String getContentsOfFile(String filePath) {
    try {
        File file = new File(filePath);
        FileInputStream fis = new FileInputStream(file);   
        String contents = //convert stream to string and return
        return contents;
    } catch(FileNotFoundException e){
        //Here this method is interested in handling the checked exception.
    } 
    return null;
}

If you don't want to handle the exception (You make your method to throw the exception)

public String getContentsOfFile(String filePath) throws FileNotFoundException {

    File file = new File(filePath);
    FileInputStream fis = new FileInputStream(file);   
    String contents = //convert stream to string and return
    return contents;        
}

Another best practice is, you can catch the checked exception and throw a Unchecked exception ( RuntimeException ) so that the caller of the method doesnt need to handle that. Spring uses this approach widely.

try {
.....
} catch (FileNotFoundException fne) {
    //log fne
    throw new RuntimeException(fne);
}

Here is a question on when to choose Checked exceptions and when to choose Unchecked exceptions. When to choose checked and unchecked exceptions

Below link says that openconnection method can throw an exception.

If you are using this method, you must use catch or throw it again.

http://docs.oracle.com/javase/1.5.0/docs/api/java/net/URL.html#openConnection%28%29

Edit: Instead of throwing exception, try like this

    private void callUrl() {
        try {
            // your stuff
        } catch (Exception e) {
            // print it for sure
        }
    }

I cut and pasted your code into Eclipse and it had me (by highlighting an error) put a try around the following:

 searchButton.addActionListener(new ActionListener() {      
 public void actionPerformed(ActionEvent event)  {
           try {
            callUrl();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
      }
   });

HttpURLConnection#openConnection throws an Exception, which callUrl() declares. initUI() calls callUrl() but does not declare the exception. This might help:

private void initUI() throws Exception {

Alternately, you could surround the HttpURLConnection#openConnection() call with a try/catch block:

private void callUrl() throws Exception {

    String url = "http://www.google.com/search?q=mkyong";

    URL obj = new URL(url);
    HttpURLConnection conn;
    try {
        conn = (HttpURLConnection) url.openConnection();
    } catch (IOException e) {
        e.printStackTrace();
        // handle the failed connection cleanly...
    }
    // and then continue processing

Since you are new to Java, I would suggest using Eclipse (an IDE) to edit your code. It will automatically make suggestions for you.

In the searchButton actionListener "actionPerformed" call, you will need to edit your code as follows:

searchButton.addActionListener(new ActionListener() {
   @Override
   public void actionPerformed(ActionEvent event)  {
       try {
        callUrl();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
  }

});

All I did was add a try/catch handler because you've declared the "callUrl()" function as throwing an exception. I ran the above code using your pasted code - this works.

Let me know if you need further help.

Here is your error:

private void callUrl() throws Exception {

When you say that a method throws Exception then every caller must somehow handle that exception. There is hardly ever a need to say that a method throws Exception (which is the mother of all "checked" exceptions) vs some more precise condition, and, in particular, if the method only throws "unchecked" exceptions (subclasses of Error or RuntimeException) then there's no need to use the throws clause at all.

In the above case you appear to have some IOException possibilities, meaning you will need to catch or declare them, but it should be sufficient to say throws IOException vs throws Exception , or, probably better, catch IOException inside the method and handle it. (It's always best to handle an exception as close to the context of throwing it as possible.)

Hint: For a test case or "quick and dirty" program it's sufficient to say throws WhateverException on the main method, vs having to handle it there. (For any "real" application, of course, you should catch the exception and present a nicely formatted error message.)

(And you can thank Mr. Goodenough for all of this mess.)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM