程序将无法运行,因为变量“可能未初始化”?

时间:2012-07-10 10:49:04

标签: java android multithreading compiler-errors

我正在尝试创建一个用于从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

3 个答案:

答案 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块上方的变量,或者在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