jsp 에서 split 함수 문제 질문 있습니다.

rlaehdtjd86의 이미지

지금 제가 전화부 양식으로 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 ("
%n");
}
}
finally{
try{
writer2.close ();
reader.close ();
}
catch (Exception e){
}
}
}

String url= String.format ("html/"+fileName);
response. sendRedirect (url);
%>
익명 사용자의 이미지

str 객체가 null 인거지요.
읽을 것이 없는데 읽었기 때문에 reader.readLine() 이 null 을 반환한 겁니다.
일반적인 사용 패턴은 while((str = reader.readLine()) != null) { do something with str } 입니다.
올리신 코드처럼 사용하는 것은 파일에 들어있는 라인의 수가 고정되어 있을 때나 사용할 수 있습니다.

익명 사용자의 이미지

그리고 readBuf = new String[5]; 는 쓰실 필요 없습니다.
split이 새로운 배열을 만들어서 반환하기 때문에 이렇게 만든 배열은 아무 의미도 없습니다.

익명 사용자의 이미지

그 아래에 있는 if 절도 아무 의미 없습니다.
split이 반환한 배열은 항상 크기가 1 이상이고, 첫번째 원소가 null일 수도 없습니다.

익명 사용자의 이미지

전체 코드의 의미도 알 수 없군요.
그냥 response 에 직접 쓰면 될 것을 굳이 파일로 쓴 다음에 그 파일로 리다이렉트를 할 필요가 있나요?

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 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>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 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>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 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>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.