-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ます。

これに対処するには、次の 2 つの方法があります。

  • iotdのようにデフォルト値を に割り当てURL iotd = null;ますiotd
  • スタック トレースを出力するだけでなく、何かが失敗した場合に関数の実行を停止します。たとえば、ブロックに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();
}

そのスニップでは、変数をURLとして宣言してiotdいますが、初期化せずに(値を割り当てずに)、tryブロック内で実行します。これは間違いではありません。ただし、何らかの理由でtryブロック内のステートメントが例外をスローした場合、プログラムフローはブロックに移動し、変数に初期値(未割り当て)をcatch残します。iotd

したがって、その場合、プログラムの実行は続行され、このステートメントに到達すると次のようになります。

in = new BufferedReader(new InputStreamReader(iotd.openStream()));

変数に割り当てられた値は見つかりませんiotd

初期化されていない値に関する警告を削除するnullには、変数を宣言するときに変数に値を割り当てるか、catchブロック内で別の例外を再スローしてプログラムフローを停止します。

一方、ここに投稿したスニペットは1つのクラスだけではなく、Threadクラスを拡張してその本体内に匿名のスニペットを作成しているため、実際には2つです。スレッドの使用は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 に答える