我正在尝试创建一个用于从rss feed解析xml的新线程。当我点击运行它说有错误请纠正它们等我在我的项目中有2个类。另一个类没有错误,下面这个类只有警告,try / catch语句中的很多东西可能都是未初始化的。我理解这一点,并认为我仍然能够运行该程序,我希望它们可以初始化,如果它们不是那么好我想知道它。这是真的发生了什么还是我错过了什么?我认为如果某些东西可能未被初始化,但它肯定没有被初始化,那么它会被编译。
public class RssParse extends Thread {
Thread th=new Thread() {
public void run(){
System.out.println("1");
URL iotd;
try {
iotd = new URL("http://www.nasa.gov/rss/image_of_the_day.rss");
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("2");
BufferedReader in;
try {
in = new BufferedReader(new InputStreamReader(iotd.openStream()));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("3");
XmlPullParserFactory factory;
try {
factory = XmlPullParserFactory.newInstance();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
factory.setNamespaceAware(true);
System.out.println("4");
XmlPullParser xpp;
try {
xpp = factory.newPullParser();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("5");
try {
xpp.setInput(in);
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("6");
int eventType;
try {
eventType = xpp.getEventType();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(eventType+"!!!!!!!!!!!!!!!!");
while(eventType!=XmlPullParser.END_DOCUMENT){
if(eventType==XmlPullParser.START_DOCUMENT){
System.out.println("start");
}
}
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}//method
};//thread
}//class
答案 0 :(得分:4)
请看这个try / catch块,例如:
URL iotd;
try {
iotd = new URL("http://www.nasa.gov/rss/image_of_the_day.rss");
} catch (MalformedURLException e) {
e.printStackTrace();
}
如果iotd = new URL("...")
失败,iotd
将保持未初始化状态。
有两种方法可以解决这个问题:
iotd
,例如:URL iotd = null;
但是,这里很糟糕,因为如果稍后使用iotd
,则其值可能为null,并且可能会抛出NullPointerException。如果出现故障而不是仅打印堆栈跟踪,请停止执行您的功能。例如,您可以在return
块中添加catch
语句:
URL iotd;
try {
iotd = new URL("http://www.nasa.gov/rss/image_of_the_day.rss");
} catch (MalformedURLException e) {
e.printStackTrace();
return;
}
答案 1 :(得分:2)
您获得的所有警告都是因为您的所有catch
块都没有处理异常(只是将堆栈跟踪打印到标准输出)。
让我们通过一个例子看到它:
URL iotd;
try {
iotd = new URL("http://www.nasa.gov/rss/image_of_the_day.rss");
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
在那个剪断的时候你宣称一个iotd
变量作为一个URL但是没有初始化它(没有分配任何值),你在try
块里面做了 - 这样做没有错。但是,如果由于任何原因try
块内的语句抛出异常,程序流将转到catch
块,并使iotd
变量保留其初始值(未分配)。
因此,在这种情况下,程序的执行将继续,并在达到此声明时:
in = new BufferedReader(new InputStreamReader(iotd.openStream()));
它找不到赋值给iotd
变量的值。
要删除有关未初始化值的警告,您可以在声明变量时为变量分配null
值,或者在catch
块内重新抛出另一个异常,停止程序流。
另一方面,你在这里发布的片段不仅仅是一个类,它实际上是两个,因为你扩展了Thread
类,然后在它的体内创建了一个匿名的类。使用线程比在Java中更容易,只需实现Runnable
接口,然后从该接口实例化一个新线程:
public class MyRunnable implements Runnable {
public void run() {
// do stuff
}
}
然后:
new Thread(new MyRunnable()).start();
欢呼声
答案 2 :(得分:0)
您需要初始化try catch
块上方的变量,或者在catch
或finally
块中为其赋值
在此处找到更新的代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
public class RssParse extends Thread {
Thread th=new Thread() {
public void run(){
System.out.println("1");
URL iotd=null;
try {
iotd = new URL("http://www.nasa.gov/rss/image_of_the_day.rss");
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("2");
BufferedReader in=null;
try {
in = new BufferedReader(new InputStreamReader(iotd.openStream()));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
System.out.println("3");
XmlPullParserFactory factory=null;
try {
factory = XmlPullParserFactory.newInstance();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
factory.setNamespaceAware(true);
System.out.println("4");
XmlPullParser xpp=null;
try {
xpp = factory.newPullParser();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("5");
try {
xpp.setInput(in);
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("6");
int eventType=-1; // set to a default value of your choice
try {
eventType = xpp.getEventType();
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(eventType+"!!!!!!!!!!!!!!!!");
while(eventType!=XmlPullParser.END_DOCUMENT){
if(eventType==XmlPullParser.START_DOCUMENT){
System.out.println("start");
}
}
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}//method
};//thread
}//class