-3

我正在尝试创建一个新线程来从 rss 提要解析 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
4

3 回答 3

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;
    }
    
于 2012-07-10T10:59:09.100 回答
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();

干杯

于 2012-07-10T11:03:07.223 回答
0

您需要初始化块上方的变量,或者在或块try catch中给它们一个值catchfinally

在这里找到更新的代码

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
于 2012-07-10T11:05:00.467 回答