jsp 에서 split 함수 문제 질문 있습니다.
지금 제가 전화부 양식으로 csv 파일을 받아 들여서 html 형식으로 파싱하는 기능을 만들고 있습니다.
jsp 기반으로 만들고 있는데 도저히 풀리지가 않아서 이렇게 질문해봅니다 ㅠ
split 함수에서 문제가 일어나는데(null pointer) 왜 일어나는지 모르겠습니다...
String[] readBuf;
readBuf = new String[5]; 
readBuf = str.split ( "," ); -> 여기에서 오류가 납니다
혹시 jsp 나 java 에 잘 알고 계신다면 꼭좀 알려주세요 ^^
전체 소스는 밑처럼 작성 하였습니다 ..
<%@ page language="java" contentType="text/html; charset=shift-jis"
    pageEncoding="shift-jis"%>
<%@ page import="myutil.MultiPart"%>
<%@ page import="java.net.URLEncoder"%>
<%@ page import="java.io.*"%>
<%
	MultiPart multiPart = new MultiPart (request);
	String fileName=multiPart.getFileName ("userFile");
	BufferedReader reader=null;
	PrintWriter writer2=null;
	FileReader FileR=null;
	String filePath2=application.getRealPath ("/html/phonebookcsv.html");
	String filePath=application.getRealPath ("/html/phonebook.csv");
	String result;
	int i;
	int k=1;
	String rb_1[]=null;
	String rb_2[]=null;
	String rb_3[]=null;
	String rb_4[]=null;
	String rb_5[]=null;
	String str=null;
	FileR=new FileReader(filePath);
	reader = new BufferedReader ( FileR );
	if (fileName.indexOf (".csv")!=-1)
	{
		try{
			writer2=new PrintWriter (filePath2);
			{
					writer2.printf ("
%n");
					writer2.printf ("<head>%n");
					writer2.printf ("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=shift-jis\">%n");
					writer2.printf ("<title>Phone Book</title>%n");
					writer2.printf ("</head>%n");
					writer2.printf ("<body>%n");
					writer2.printf ("<center><h1><font size=20>電話帳</font></h1></center>%n");
					writer2.printf ("<center><form action=\"../NewPage.jsp\" method=post enctype=\"multipart/form-data\"><input type=file name=userFile><BR><input type=submit value=\"ファイル読込\"></form></center>");
					writer2.printf ("<form ACTION=\"../SavetoFile.jsp\" METHOD=\"post\">%n");
					writer2.printf ("<DIV align=\"center\"><TABLE style=\"border: 1px solid #2875C1\" bgcolor=\"#C7E2FE\" cellspacing=\"1\" cellpadding=\"0\" width=\"75%%\" height=\"50%%\">%n");
					writer2.printf ("<TR><td align=\"center\" vAlign=\"middle\" style=\"border: 1px solid #f0f0f0\"  bgcolor=\"#c1ccf7\" width=\"10%%\" >内線番号</td><td align=\"left\" vAlign=\"middle\" style=\"border: 1px solid #f0f0f0\"  bgcolor=\"#c1ccf7\" ><input type=text size=\"10\" name=file ></td><td align=\"left\" vAlign=\"middle\" style=\"border: 1px solid #f0f0f0\"  bgcolor=\"#c1ccf7\" colspan=\"3\"><input type=submit value=\"保存\"></td></TR>");
					writer2.printf ("<TR>%n");
					writer2.printf ("<TD align=\"center\" vAlign=\"middle\" style=\"border: 1px solid #2875C1\"  bgcolor=\"#C7E2FE\" width=\"10%%\">短縮番号</TD><TD align=\"center\" vAlign=\"middle\" style=\"border: 1px solid #2875C1\"  bgcolor=\"#C7E2FE\" width=\"30%%\" >名前</TD><TD align=\"center\" vAlign=\"middle\" style=\"border: 1px solid #2875C1\"  bgcolor=\"#C7E2FE\" width=\"30%%\" >ヨミガナ</TD><TD align=\"center\" vAlign=\"middle\" style=\"border: 1px solid #2875C1\"  bgcolor=\"#C7E2FE\" width=\"30%%\" >電話番号</TD><TD align=\"center\" vAlign=\"middle\" style=\"border: 1px solid #2875C1\"  bgcolor=\"#C7E2FE\" width=\"5%%\">タイプ</TD></TR>%n");
 
					for (i=0;i<900;i++){
							str=reader.readLine ( );
							String[] readBuf;
							readBuf = new String[5]; 
							readBuf = str.split ( "," );
							if(readBuf[0]==null){
								readBuf[0] = ""+k+"";
								readBuf[1] = "0";
								readBuf[2] = "0";
								readBuf[3] = "0";
								readBuf[4] = "0";
							}
 
							writer2.printf (" <TR> <TD align=\"center\" vAlign=\"middle\" style=\"border: 1px solid #2875C1\" bgcolor=\"#edfefd\"> <input type=text name=ShortNumber size=\"8%%\" align = middle readonly value=%s ></TD><TD align=\"center\" vAlign=\"middle\" style=\"border: 1px solid #2875C1\" bgcolor=\"#edfefd\"> <INPUT TYPE=TEXT NAME=Name SIZE=\"50%%\" value=\"%s\"></TD><TD align=\"center\" vAlign=\"middle\" style=\"border: 1px solid #2875C1\" bgcolor=\"#edfefd\"> <INPUT TYPE=TEXT NAME=pronunciation SIZE=\"50%%\" value=\"%s\"></TD><TD align=\"center\" vAlign=\"middle\" style=\"border: 1px solid #2875C1\" bgcolor=\"#edfefd\"> <INPUT TYPE=text NAME=TelephoneNumber SIZE=\"50%%\" value=\"%s\"></TD><TD align=\"center\" vAlign=\"middle\" style=\"border: 1px solid #2875C1\" bgcolor=\"#edfefd\"> ",readBuf[0],readBuf[3],readBuf[1],readBuf[2]);
								if ( readBuf[4].equals ("0") )
									writer2.printf ("<select name=\"Type\"><option value=\"0\" selected>外線</option><option value=\"1\">内線</option></select></TD></TR>");
								else if ( readBuf[4].equals ("1") )
									writer2.printf ("<select name=\"Type\"><option value=\"0\">外線</option><option value=\"1\"selected>内線</option></select></TD></TR>");
							k++;
					}
					writer2.printf ("</TR>%n");
					writer2.printf ("</TABLE></DIV>%n");
					writer2.printf ("<center><INPUT TYPE=SUBMIT VALUE=\'保存\'></CENTER>%n");
					writer2.printf ("</form>%n");
					writer2.printf ("<center><form action = \"http://localhost/In/IntoWeb.html\" method=post><input type=submit value=Home></form></center>%n");
					writer2.printf ("</body>%n");
					writer2.printf ("}
}
finally{
try{
writer2.close ();
reader.close ();
}
catch (Exception e){
}
}
}
String url= String.format ("html/"+fileName);
response. sendRedirect (url);
%>


str 객체가 null 인거지요. 읽을 것이 없는데
str 객체가 null 인거지요.
읽을 것이 없는데 읽었기 때문에 reader.readLine() 이 null 을 반환한 겁니다.
일반적인 사용 패턴은 while((str = reader.readLine()) != null) { do something with str } 입니다.
올리신 코드처럼 사용하는 것은 파일에 들어있는 라인의 수가 고정되어 있을 때나 사용할 수 있습니다.
그리고 readBuf = new String[5];
그리고 readBuf = new String[5]; 는 쓰실 필요 없습니다.
split이 새로운 배열을 만들어서 반환하기 때문에 이렇게 만든 배열은 아무 의미도 없습니다.
그 아래에 있는 if 절도 아무 의미
그 아래에 있는 if 절도 아무 의미 없습니다.
split이 반환한 배열은 항상 크기가 1 이상이고, 첫번째 원소가 null일 수도 없습니다.
전체 코드의 의미도 알 수 없군요. 그냥
전체 코드의 의미도 알 수 없군요.
그냥 response 에 직접 쓰면 될 것을 굳이 파일로 쓴 다음에 그 파일로 리다이렉트를 할 필요가 있나요?
댓글 달기