我是Android开发者的总菜鸟。我还在学习,而且我正处于我的app dev的第一步。
我有这个代码工作,它运行良好或常规Java,现在我正在尝试实现Android OS。
在我的代码中显示TEST.openStream()
我收到Unhandled exception type IOException
错误。
package com.zv.android;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import android.app.Activity;
import android.os.Bundle;
public class ZipActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try {
URL TEST = new URL("http://www.google.com/");
BufferedReader in = new BufferedReader(new InputStreamReader(TEST.openStream()));
String inputLine;
int line=0;
while ((inputLine = in.readLine()) != null){
line++;
//System.out.println(line + "\t" + inputLine);
}
// in.close();
} catch(MalformedURLException e) {
//Do something with the exception.
}
}
}
答案 0 :(得分:9)
错误消息很简单:您需要捕获IOException
,因为URL.openStream()
被声明为
public final InputStream openStream() throws IOException
因此,通过接受方法的契约,您也接受了必须处理此异常的事实,这就是它在Java中的工作方式。这是已检查的异常,然后必须将其捕获,因为此类异常表示可能出现的情况以及您的代码必须处理的情况。
要抓住它,只需在try
声明中添加另一个案例:
try {
..
catch (MalformedURLException e) {
..
}
catch (IOException e) {
..
}
正如最后一点:当你调用openStream()
方法时,你不需要捕获它,你可以声明调用openStream()
的方法会将异常转发给调用者,但是在任何情况下,你都必须抓住它的结束。
答案 1 :(得分:3)
也抓住IOException
,就像你对MalformedURLException
(或)声明方法一样抛出IOException
。
try {
URL TEST = new URL("http://www.google.com/");
BufferedReader in = new BufferedReader(new InputStreamReader(TEST.openStream()));
String inputLine;
int line=0;
while ((inputLine = in.readLine()) != null){
line++;
//System.out.println(line + "\t" + inputLine);
}
// in.close();
} catch(MalformedURLException e) {
//Do something with the exception.
} catch(IOException e2) {
//Do something with the exception.
}
IOException
被检查异常,需要捕获(或)重新抛出。有关详细信息,请参阅此tutorial。
您需要捕获IOException,因为openStream()方法可能会在异常情况下抛出IOException。
答案 2 :(得分:1)
TEST.openStream()
可能会抛出IOException,这是java中的已检查异常,因此您必须使用 try / catch 块处理 IOException或使用 throws 子句在方法签名中声明 IOException。
你必须在catch块中处理IOException。
try {
URL TEST = new URL("http://www.google.com/");
BufferedReader in = new BufferedReader(new InputStreamReader(TEST.openStream()));
//rest of your code
} catch(MalformedURLException e) {
//Do something with the exception.
}
catch(MalformedURLException e) {
//Do something with the exception.
}
catch(IOException ex) {
ex.printStackTrace();
}
在方法签名中声明IOException:
public void onCreate(Bundle savedInstanceState) throws IOException {
在这种情况下你不要将你的代码包装在try / catch中,尽管我强烈建议总是使用try / catch处理异常,而不是使用throws子句声明它。