The literal of type int is out of range 에러 발생 대처

      Error


    The literal of type int is out of range


    long이기 때문에 왠만한 숫자값은 다 받아서 처리가 될 수 있을 거라 생각을 했는데 out of range 에러가 발생하였다.




      이상이 없는 부분


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    package timeConvert;
     
    import java.text.SimpleDateFormat;
    import java.util.Date;
     
    public class main {
     
        public static void main(String[] args) {
            long time = System.currentTimeMillis();
            long time2 = System.currentTimeMillis() / 1000;
            long time3 = time2 * 1000;
                    
            System.out.println(time + " " + time2 + " " + time3);
            
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            String str = sdf.format(new Date(time));
            String str2 = sdf.format(new Date(time3));
            
            System.out.println(str + " " + str2);
        }
    }

    cs



    여기까지는 정상적으로 아래와 같은 출력을 수행한다


    1504655045240 1504655045 1504655045000

    2017-09-06 08:44:05 2017-09-06 08:44:05



    문제는 중간에 있는 값을 직접 넣어서 할 경우 발생하게 된다. 



      이상이 있는 부분


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static void main(String[] args) {
            long time = 1504655045;
            long time2 = 1504655045 * 1000;
                            
            System.out.println(time + " " + time2);
            
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            String str = sdf.format(new Date(time));
            
            System.out.println(str);
    }

    cs


    상식적으로는 이상이 없어 보인다. 1504655045 값에 1000을 곱하면, 1504655045000이 되어야 하는 간단한 부분인데

    아래와 같은 결과가 나온다


    1504655045 1416491400

    1970-01-18 06:57:35



    오히려 값이 줄어드는 현상이 발생했다. 그럼 이번에는 1504655045000 값을 직접 입력해보면 어떻게 될까?


    long time2 = 1504655045000;

    이렇게 값을 넣으려고 하니, 결국 제목과 같은 "The literal 1504655045000 of type int is out of range" 에러 메세지가 출력된다.

    대충 내용을 읽어보니, 뒤에 입력한 숫자는 int로 인식을 하는 것 같고, int값의 범위를 벗어나서 에러가 출력이 되는 것 같다.


    그럼, 간단히 말해서 이 문제는 int를 long형으로 인식시켜주면 문제가 해결이 된다는 셈이다.


    long time2 = (long)1504655045000;

    이렇게 하면 될 것이라 생각했는데 여전히 에러가 발생한다



      out of range 해결법 1


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static void main(String[] args) {
            long time = 1504655045;
            long time2 = Long.parseLong(Long.toString(time) + "000");
                            
            System.out.println(time + " " + time2);
            
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            String str = sdf.format(new Date(time2));
            
            System.out.println(str);
    }
    cs


    무식한 방법으로, 현재의 값을 String으로 바꾸고 값 마지막에 000이라는 문자를 더한다음 다시 Long 형으로 바꿔주니

    결과는 정상적으로 출력이 되었다. 그러나 이건 너무 무식한 방법이니 패스



      out of range 해결법 2


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static void main(String[] args) {
            long time = 1504655045;
            long time2 = 1504655045000L;
                            
            System.out.println(time + " " + time2);
            
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            String str = sdf.format(new Date(time2));
            
            System.out.println(str);
    }
    cs


    int 값이 아니라 이 값은 Long 형이다라는 것을 명시적으로 알려주는 방식으로 마지막에 L값을 붙인다.

    이렇게 하면 int is out of range 에러는 발생하지 않는다.

    반응형

    댓글

    Designed by JB FACTORY