JAVA에서 NullPointerException 에 대해 질문을 드릴게요

anaud2의 이미지

안녕하세요

java로 특정 함수를 만들고 있는데요

public static int auth(String ID,String PW)
              throws IOException, SocketException, ValueException //ValueException은 만든 예외클래스로 IOException을 상송받는다.
{
      if(IP.equals("") || ID == null){
			  throw new ValueException("IP null");	//특정 요인에 맞으면 예외를 발생시키기 위해 만들었다.
      }
//중략
main(){
  //중략
  try{
  i = auth_test.auth(null, "123456"); 
  }catch(IOException e){
	e.printStackTrace();		
  }
}

제가 생각했을때는 사용자가 null을 인자값으로 넣었을때도 제가 만든 예외가 발생하게 하고 싶은데요 막상 해보니까
NullPointerException이 발생을 합니다.

 }catch(NullPointerException e){
	e.printStackTrace();
  }

위처럼 catch를 해주면 되긴하는데...그건 제가 바라는게 아니라서요...
if문에서 ID == null이 된다고 생각을 했는데..if문에서 걸리질 않네요 C에서는 되는데 null인자가 넘어온걸 어떻게 잡아내면 될까요?
dragonkun의 이미지

ID == null 됩니다.

문제는 IP.equals("") 에서 IP 가 null이면 NullPointerException이 발생하겠네요.
--
Emerging the World!

Emerging the World!

M.W.Park의 이미지

일단 위에서 IP는 ID의 오타로 보이는군요.

조금만 부연하자면, 논리연산자로 엮인 논리식은 경우에 따라서 다 평가하지 않습니다.
short circuit라고 불리는데,
AND로 묶인 것들은 앞에서 부터 평가하다가 최초 false가 나오는 순간 전체 논리식이 false가 됩니다.
OR로 묶이면? 최초 true를 만나면 전체 식이 true가 됩니다.

예시하신 논리식

ID.equals("") || ID == null

은 전형적인 나쁜 스타일입니다 (object의 method를 null 검사 전에 부르는 것은 아주 안좋은 스타일입니다).
다음 둘중에 하나로 고치시면 됩니다.
ID == null || ID.equals("")  // null 체크 먼저 하게...
or
"".equals(ID) || ID == null  // ID가 null이라도 상관없게...

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

anaud2의 이미지

정말 새로운 내용을 알게되었네요 고맙습니다.^^

hosung의 이미지

위의 M.W Park님 의견에 동감합니다.
실제 존재하지 않는 주소에 우편물을 보내는 부분과 주소지는 존재하나 주인(?)이 수신자가 맞는지 부분만을 놓고 봤을때 checking priority 는 전자가 되어야 겠지요. 쓰고보니 위 reference 관련 표현이 이상하긴 하네요. :)

저같은 경우는 통상적으로(특수환경 제외) Util Class를 만들어 처리하고 있습니다.

public class MyUtil {
    public static boolean isEmpty( Object obj ) {
	if ( obj == null || obj.toString().equals( "" ) ) return true;
	return false;
    }
}

if ( MyUtil.isEmpty(ID) ) {
    throw new ValueException("IP null");	//특정 요인에 맞으면 예외를 발생시키기 위해 만들었다.
}

오늘도 For() 와 If()로 나의 하루는 시작되고 끝난다.


--오늘도 For() 와 If()로 나의 하루는 시작되고 끝난다.

anaud2의 이미지

함수로 처리하는부분도 코드가 상당히 깔끔해지네요 좋은정보 감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.