java.lang.NullPointerException 에러는 무엇인가?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import java.util.Scanner;
 
public class Main {
   static Integer[][] arr = new Integer[3072][6143];
    
   public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       int num = sc.nextInt();
       star(num-1,0,num);
       for(int i=0; i<num; i++) {
           for(int j=0; j<2*num-1; j++) {
               if(arr[i][j]==1) {
                   System.out.print("*");
               }else {
                   System.out.print(" ");
               }
           }
           System.out.println();
       }
   }
   static void star(int x, int y, int size) {
       if(size==3) {
           arr[y][x] = 1;
           arr[y+1][x-1= 1;
           arr[y+1][x+1= 1;
           
           arr[y+2][x+2= 1;
           arr[y+2][x+1= 1;
           arr[y+2][x] =1;
           arr[y+2][x-1=1;
           arr[y+2][x-2=1;
       }else {
           size /= 2;
           star(x,y,size);
           star(x-size,y+size,size);
           star(x+size,y+size,size);
       }
   }
}
 
cs


이와 같이 12번 째 줄에 NullPointerException 예외가 발생된다.

이를 해결하고자 구글에 NullPointerException 에러를 검색해봤다. 


---------------------------------------------------------------------------------------------------------------------------------------------------------------


레퍼런스 변수를 선언하면 객체의 포인터가 생성됩니다. 즉, 레퍼런스 변수는 객체의 주소 (참조값)을 저장합니다. 프리티미트 타입 (기본 타입)인 int 타입의 변수를 다음과 같이 선언한다고 가정해보면:

int x; x = 10;

이 예제의 첫번째 명령문에서 변수 x는 int 타입으로 선언되어, 자바는 이 변수의 값을 0으로 초기화합니다 (단, 변수 x가 클래스의 필드로 정의되었을 때). 그리고 두 번째 명령문과 같이 해당 변수 x에 10이라는 값을 대입 연산자를 사용하여 할당하면, 변수 이름 x가 가리키는 메모리 위치에 10이라는 값이 쓰여집니다.

그러나 레퍼런스 타입의 변수를 선언할 때는 다르게 처리됩니다. 다음의 코드를 살펴보면:

Integer num;

num = new Integer(10);

첫번째 명령문에서 num이라는 이름으로 선언된 변수는 프리미티브 값을 저장하지 않습니다. 대신, Integer라는 이름의 타입은 래퍼클래스로서, 레퍼런스타입이므로 해당 변수는 주소 (참조값)을 저장합니다. 첫번째 명령문은 아직 어떤 것을 참조하라고 정의하지 않았기 때문에 자바는 그 변수를 null로 초기화합니다 (단, 변수 num이 클래스의 필드로 정의되었을 때). 이것은 "나는 아무것도 참조하지 않아"라는 의미입니다.

두 번째 명령문은 new라는 키워드를 사용해서 Integer 클래스 객체를 생성하고 해당 객체의 주소 (참조값을) num이라는 변수에 저장합니다. 이렇게 객체를 생성하고 객체의 참조값을 저장한 변수를 사용해서 해당 객체에 접근할 수 있습니다. 이 때, . 연산자를 사용합니다.

만약 레퍼런스 타입의 변수를 선언하고 객체를 생성하지 않으면 (즉, 객체의 참조값을 해당 변수에 저장하지 않으면) Exception이 발생됩니다. 즉, 객체가 생성되기 전에 num 변수를 사용해서 해당 클래스의 객체를 접근하고자 하면 NullPointerException이 발생됩니다. 이러한 경우 대부분 컴파일러가 해당 문제를 인식해서 경로 메시지로 알려줄 것입니다. "num 변수가 아직 초기화되지 않았어"라고요.

아래와 같은 메소드에 대해서,

public void doSomething(Integer num) { // do something to num }

다음과 같이 호출한다면,

doSomething(null);

num 변수의 값은 null이 됩니다. 이러한 null 값을 가지는 num 변수를 사용해서 객체의 필드 혹은 메소드에 접근하고자 한다면 NullPointerException이 발생하게 되는 것입니다. 이와 같은 exception이 발생되지 않게 하는 최선의 방법은 다음과 같이 레퍼런스 변수를 사용하기 전에 null 값을 저장하고 있는지를 체크하는 것입니다.

public void doSomething(Integer num) { if(num != null) { // do something to num } }

-------------------------------------------------------------------------------------------------------

12번째줄의

if(arr[i][j]==1)를 if(arr[i][j]!=null) 로 고치니 문제가 해결됬다.


'프로그래밍 > JAVA' 카테고리의 다른 글

싱글턴 패턴 사용하는 이유  (0) 2019.01.06
abstract와 Interface  (0) 2019.01.04
public static void main(String[] args)  (0) 2018.11.22
java exe 파일 만들기  (0) 2018.09.01
자바 OutputStream 줄바꿈  (0) 2018.08.31

https://jeong-pro.tistory.com/86

'프로그래밍 > JAVA' 카테고리의 다른 글

NullPointerException  (0) 2019.01.22
abstract와 Interface  (0) 2019.01.04
public static void main(String[] args)  (0) 2018.11.22
java exe 파일 만들기  (0) 2018.09.01
자바 OutputStream 줄바꿈  (0) 2018.08.31

Interface, Abstract

Interface

- 일종의 추상 클래스

- 오직 추상메서드와 상수만을 멤버로 갖는다.

- Implements 키워드를 사용

- 상속의 관계가 없는 클래스간 서로 공통되는 로직을 구현하여 쓸 수 있도록한다.

- Extends는 하나의 클래스만 상속 가능하나 Interface는 다중 상속이 가능하다.

Abstract

- 추상메서드를 하나 이상 가진 클래스

- 자신의 생성자로 객체 생성 불가능

- 하위 클래스를 참조하여 상위 클래스의 객체를 생성

- 하위 클래스를 제어하기 위해 사용


Abstract vs Interface

추상 클래스(Abstract)

클래스를 설계도에 비유한다면 추상클래스는 미완성 설계도에 비유할 수 있다. 미완성 설계도란, 단어

의 뜻 그대로 완성되지 못한 채로 남겨진 설계도를 말한다. 클래스가 미완성이라는 것은 멤버의 개수에

관계된 것이 아니라, 단지 미완성 메서드(추상메서드)들 포함하고 있다는 의미이다. 미완성 설계도로

완성된 제품을 만들 수 없듯이 추상클래스로 인스턴스는 생성활 수 없다. 추상클래스는 상속을 통해서

자손클래스에 의해서만 완성될 수 있다.

**자바의 정석 참고**

인터페이스 (Interface)

인터페이스는 일종의 추상클래스이다. 인터페이스는 추상클래스처럼 추상메서드를 갖지만 추상클래스 보다 추상화 정도가 높아서 추상클래스와는 달리 몸통을 갖춘 일반 메서드 또는 멤버변수를 구성원으 로 가질 수 없다. 오직 추상메서드와 상수만을 멤버로 가질 수 있으며, 그 외의 어떠한 요소도 허용하지 않는다. 추상클래스를 부분적으로만 완성된 '미완성 설계도'라고 한다면, 인터페이스는 구현된 것은 아 무것도 없고 밑그림만 그려져 있는 '기본 설계도'라고 할 수 있다. 인터페이스는 인터페이스로부터만 상속받을 수 있으며, 클래스와는 달리 다중상속, 즉 여러개의 인터페이스로부터 상속을 받는 것이 가능 하다.

**자바의 정석 참고**


공통점 

- new 연산자로 인스턴스 생성 불가능.

- 프로토타입만 있는 메서드를 갖는다.

- 사용하기 위해서는 하위클래스에서 확장/구현 해야 한다.

차이점

- 사용하는 키워드가 다르다.

- Abstract는 일반 메서드를 사용할 수 있지만, Interface는 메서드 선언만 가능하다.



출처: http://ktko.tistory.com/

'프로그래밍 > JAVA' 카테고리의 다른 글

NullPointerException  (0) 2019.01.22
싱글턴 패턴 사용하는 이유  (0) 2019.01.06
public static void main(String[] args)  (0) 2018.11.22
java exe 파일 만들기  (0) 2018.09.01
자바 OutputStream 줄바꿈  (0) 2018.08.31

public static void main(String[] args)에서 각각의 의미


main 함수는 프로그램의 시작부터 끝까지 있는 함수이다.


1. public을 사용하는 이유?

다른 클래스들의 메소드들을 호출해서 사용하는데, main 자체가 다른곳에서 접근을 허용하지 않으면 문제가 발생하기

때문에 public 사용


2. static을 사용하는 이유?

static의 특징으로는 따로 인스턴스화 하지 않아도 되고, 시작과 동시에 메모리에 호출되어진다는 점이다.

즉, 프로그램이 종료될 때까지 계속 유지가 되는데, static이 있기 때문에 계속 참조할 수 있고, GC(garbage collector)에

의해서 사라질 염려가 없기에, static을 사용해야한다.


3. void를 사용하는 이유?

main 함수 자체가 시작과 끝을 의미하는 것인데, 종료되는 시점에서 무슨 값을 반환한다 해서 의미가 있다고 생각하지

않는다. 그렇기 때문에 void로 설정해야한다.


4. args[]를 사용하는 이유?

처음 프로그램을 실행하는 순간 외부 값을 가져와서 프로그램 안에 사용하고자 할 때, 메모리에 저장할 공간을 미리 선언

해 두기 위해서 사용

'프로그래밍 > JAVA' 카테고리의 다른 글

싱글턴 패턴 사용하는 이유  (0) 2019.01.06
abstract와 Interface  (0) 2019.01.04
java exe 파일 만들기  (0) 2018.09.01
자바 OutputStream 줄바꿈  (0) 2018.08.31
JAVA 파일입출력  (0) 2018.08.30

 java exe 파일 만들기

(1) 이클립스로 만든 java를 JAR 배포판 만들기

http://javacrush.tistory.com/entry/java-%EB%82%B4-java-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-JAR-%EB%A1%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0?category=284815


(2) java 파일을 exe 배포판 만들기

http://javacrush.tistory.com/entry/java-JAR-%ED%8C%8C%EC%9D%BC%EC%9D%84-EXE-%ED%8C%8C%EC%9D%BC-%EB%B0%B0%ED%8F%AC%ED%8C%90-%EB%A7%8C%EB%93%A4%EA%B8%B0?category=284815

'프로그래밍 > JAVA' 카테고리의 다른 글

abstract와 Interface  (0) 2019.01.04
public static void main(String[] args)  (0) 2018.11.22
자바 OutputStream 줄바꿈  (0) 2018.08.31
JAVA 파일입출력  (0) 2018.08.30
자바 다운그레이드  (0) 2018.08.26



http://clairdelunes.tistory.com/17


줄바꿈 계속 \n으로 안되서 찾아보니까 \r\n 으로 해야한다고 한다.


1. System.out.format() 을 이용하여 %n 개행 처리.

이렇게하면 운영체제 에 맞게 처리된다.


2. (String타입 변수명).replace("\n","\r\n")

이렇게하면 윈도우 호환에 맞게끔 처리할 수 있다.


3. String line = System.getProperty("line.separator");

   str = str.replace("\n", line);

요렇게 해도 운영체제에 맞게 줄바꿈처리가 된다.


주로 3번을 많이 사용하게 되는 것 같다.



출처: http://clairdelunes.tistory.com/17 [거꾸로 바라본 세상]

'프로그래밍 > JAVA' 카테고리의 다른 글

public static void main(String[] args)  (0) 2018.11.22
java exe 파일 만들기  (0) 2018.09.01
JAVA 파일입출력  (0) 2018.08.30
자바 다운그레이드  (0) 2018.08.26
자바빈(DTO), DAO  (0) 2018.07.28


파일읽기 파일읽기과 저장을 함께

'프로그래밍 > JAVA' 카테고리의 다른 글

java exe 파일 만들기  (0) 2018.09.01
자바 OutputStream 줄바꿈  (0) 2018.08.31
자바 다운그레이드  (0) 2018.08.26
자바빈(DTO), DAO  (0) 2018.07.28
JAVA 관련 사이트 기술 커리큘럼  (0) 2018.07.25


JAVA, JSP 버전 다운그레이드


http://mainia.tistory.com/2184

'프로그래밍 > JAVA' 카테고리의 다른 글

자바 OutputStream 줄바꿈  (0) 2018.08.31
JAVA 파일입출력  (0) 2018.08.30
자바빈(DTO), DAO  (0) 2018.07.28
JAVA 관련 사이트 기술 커리큘럼  (0) 2018.07.25
스트레티지 패턴  (0) 2018.07.23

빈을 설정해서 MemberDto에서 GETTER SETTER 해준 값들을 전역으로 사용할 수 있다.

dto.getId() 이렇게 사용가능하다. 

'프로그래밍 > JAVA' 카테고리의 다른 글

JAVA 파일입출력  (0) 2018.08.30
자바 다운그레이드  (0) 2018.08.26
JAVA 관련 사이트 기술 커리큘럼  (0) 2018.07.25
스트레티지 패턴  (0) 2018.07.23
Java for-each 쉽게 이해하기  (0) 2018.07.19

JAVA 관련 사이트


JAVA 기술 커리큘럼


'프로그래밍 > JAVA' 카테고리의 다른 글

자바 다운그레이드  (0) 2018.08.26
자바빈(DTO), DAO  (0) 2018.07.28
스트레티지 패턴  (0) 2018.07.23
Java for-each 쉽게 이해하기  (0) 2018.07.19
JAVA 싱글턴 패턴  (0) 2018.07.19

+ Recent posts