2012-07-10 5 views
-3

RSS 피드에서 xml을 구문 분석하기위한 새 스레드를 만들려고합니다. 실행을 클릭하면 오류가 있다고 말합니다. 등등. 프로젝트에 2 개의 클래스가 있습니다. 다른 클래스에는 오류가 없으며 아래 클래스는 try/catch 문에서 많은 것들이 초기화되지 않을 수 있다는 경고 만 있습니다. 나는 그것을 이해하고 나는 어쨌든 프로그램을 실행할 수 있어야한다고 생각했다. 나는 그것들이 초기화 될 것이라고 기대한다. 그렇지 않다면 나는 그것에 대해 알고 싶다. 이 일이 실제로 진행되고 있거나 내가 놓친 것이 있습니까? 뭔가 초기화되지 않았지만 확실하게 초기화되지 않은 경우 컴파일 될 것이라고 생각했습니다. 예를 들어이 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 
+1

내가 인상이었고, 영업 이익 @robertboloc – robertboloc

+1

하여 해결하시기 바랍니다 오류 ... –

답변

4

봐 : iotd = new URL("...")이 실패하면

URL iotd; 
    try { 
     iotd = new URL("http://www.nasa.gov/rss/image_of_the_day.rss"); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } 

iotd가 초기화되지 않은 유지됩니다.

이 처리하는 방법은 두 가지가 있습니다 URL iotd = null; 그러나, 당신이 나중에 iotd를 사용하는 경우 그 값이 null이 될 수 있기 때문에 여기에 나쁜와는 NullPointerException을 던질 수 :

  • 같이, iotd에 기본 값을 할당은 .
  • 스택 추적을 인쇄하는 대신 실패한 경우 함수 실행을 중지하십시오. 예를 들어, 당신은 catch 블록에 return 문을 추가 할 수 있습니다 : 모든 catch 블록은 단지 표준 스택 트레이스를 인쇄 (모두에서 예외를 처리하지 않기 때문에 당신이 점점

    URL iotd; 
    try { 
        iotd = new URL("http://www.nasa.gov/rss/image_of_the_day.rss"); 
    } catch (MalformedURLException e) { 
        e.printStackTrace(); 
        return; 
    } 
    
+0

확인 감사가 말한다 "모두 지우기 보풀 마커"옵션을 사용하려고 여전히 어떤 경우 컴파일 할 것 "초기화되지 않았을 수 있습니다." –

2

모든 경고를 아웃).

의이 예를 통해 살펴 보자 : 당신이 URL로하지만 (어떤 값을 할당하지 않음)를 초기화하지 않고 iotd 변수를 선언하는 냈다 저것

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(); 
} 

, 당신은 try 블록 내부에 그것을 -하는 도중에 잘못이 아닙니다. 그러나 어떤 이유로 든 try 블록 내부의 문이 예외 프로그램 흐름을 발생시키는 경우 iotd 변수를 초기 값 (지정되지 않음)으로 남겨둔 catch 블록으로 이동합니다. 이 문에 도달 할 때

그래서,이 경우, 프로그램의 실행은 계속됩니다

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

IT는 iotd 변수에 할당 된 값을 찾을 수 없습니다.

초기화되지 않은 값에 대한 경고를 제거하려면 변수를 선언 할 때 null 값을 할당하거나 catch 블록 내에서 다른 예외를 다시 시도하여 프로그램 흐름을 중지 할 수 있습니다.

다른 한편으로, 여기에 게시 한 스 니펫은 하나의 클래스 만이 아니며 실제로는 Thread 클래스를 확장 한 다음 실제로 익명으로 만드는 두 가지 클래스입니다.스레드를 자바에서보다 쉽게 ​​사용, 단지 Runnable 인터페이스를 구현 한 다음 새 해당 인터페이스에서 스레드의 인스턴스 : 다음

public class MyRunnable implements Runnable { 
    public void run() { 
     // do stuff 
    } 
} 

과 :

new Thread(new MyRunnable()).start(); 

환호를

당신은 초기화 할 필요가
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 
관련 문제