aspose file tools*
The moose likes Beginning Java and the fly likes Using Scanner to read one line at a time Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of Soft Skills this week in the Jobs Discussion forum!
JavaRanch » Java Forums » Java » Beginning Java
Bookmark "Using Scanner to read one line at a time" Watch "Using Scanner to read one line at a time" New topic
Author

Using Scanner to read one line at a time

Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44
I know that with BufferedReader its pretty simple, but I need to use scanner.

Here's what I have, loosely based off of how BufferedReader does it



the huge comment portion in the middle is what I need this method to do.

I get an error on the inputLine = scanner.readLine()
[ December 11, 2005: Message edited by: Kevin Tansey ]

BSIT student @ CSUCI
Keith Lynn
Ranch Hand

Joined: Feb 07, 2005
Posts: 2367
I think the method is nextLine() and not readLine()
Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44
thank you, that looks right!
Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44
building on this scanner thing, I'm having trouble understanding what is needed to be done to complete this method:



I'm getting "the field course.X is not visible" for all 3 of the lines I added
but I can't find any other way of doing that in my book.
Keith Lynn
Ranch Hand

Joined: Feb 07, 2005
Posts: 2367
It looks like those variables are private in Course. I would recommend creating set methods for those variables.
Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44
I think I figured it out.



however I get 2 "warnings" (I'm using Eclipse as my editer)
"The local variable title (and numCredits) is never read"

I dont understand what that means or if anything is actually wrong?
Jim Yingst
Wanderer
Sheriff

Joined: Jan 30, 2000
Posts: 18671
[Keith]: It looks like those variables are private in Course. I would recommend creating set methods for those variables.



They're not private, they're local. We're looking at a method here, not a class. Most of those variables are of no interest outside the method - the point is to take a String representing a line, and return a Course object. Any variables used along the way are irrelevant outside the method.

[Kevin]: I dont understand what that means or if anything is actually wrong?

Let's just say it's a clue. Going back to my previous paragraph - what exactly is being returned by this method? Have you tested the result in any way? Even, say, by printing it out?
[ December 11, 2005: Message edited by: Jim Yingst ]

"I'm not back." - Bill Harding, Twister
Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44
heh, I haven't figured out how to get anything to run in eclipse yet

so I put all I've got into BlueJ and tried running it and got an exception error at another spot, although I'm not sure if this chunk of code has been executed at that point or not...

the only other location I can see createCourses being used (called) is in these methods:




it looks like its just used as a placeholder for the array semesterList?
Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44
got it to run in eclipse, this gives me a better output than blueJ did:


The whole transcript for student1

Transcript:

Exception in thread "main" java.util.IllegalFormatConversionException: f != java.lang.String
at java.util.Formatter$FormatSpecifier.failConversion(Unknown Source)
at java.util.Formatter$FormatSpecifier.printFloat(Unknown Source)
at java.util.Formatter$FormatSpecifier.print(Unknown Source)
at java.util.Formatter.format(Unknown Source)
at java.io.PrintStream.format(Unknown Source)
at java.io.PrintStream.printf(Unknown Source)
at Student.main(Student.java:246)
The gpa is


decimalformat is throwing an exception because it has nothing to format

for the record the output should be this:


The whole transcript for student1

Transcript:
Course: Java (4 credits); grade=A
Course: Basic (2 credits); grade=C
Course: C++ (3 credits); grade=D

The gpa is 2.56

Java for student1 -- Course: Java (4 credits); grade=A
Worst grade for student1 -- Course: C++ (3 credits); grade=D
Change the grade to A
The course for student1 is now -- Course: C++ (3 credits); grade=A
The gpa is now 3.56


[ December 11, 2005: Message edited by: Kevin Tansey ]
Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44
hopefully I didn't scare you guys off




this is the last chunk I'm working on, all it had before I started was the "return null"

right now I'm getting 6 errors:
"getNumCourses cannot be resolved to a type"
"numCourse cannot be resolved"
"course cannot be resolved" x4


I *think* what I need this method to do is print the course listing, but the commenting on it was a bit vague as to what needs to be done ("ADD CODE" doesn't really describe much!)

this is in a seperate file from the other fragments.

this whole file is:

Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44
well that was pretty easy.

had to step back and think about it a little harder...ugh





now I gotta fix some bugs I guess, as the program doesn't work right

The whole transcript for student1

Transcript:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at Transcript.getCourseGrade(Transcript.java:59)
at Transcript.getWorstGradeIndex(Transcript.java:132)
at Student.main(Student.java:250)
The gpa is NaN

Java for student1 -- null
Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44
I believe my errors are back to the scanner problem



I have 2 warnings for this area:
"the local variable (title, numCredits) is never used" - Student.java
Jim Yingst
Wanderer
Sheriff

Joined: Jan 30, 2000
Posts: 18671
[Kevin]: "the local variable (title, numCredits) is never used" - Student.java

Let's just say it's a clue. Going back to my previous paragraph (in my last post) - what exactly is being returned by this method? Have you tested the result in any way? Even, say, by printing it out?

If the code is copmpiling now (even with warnings), then you can run it and add some code to see what it's doing. For example, you could add this at the end of the createCourse() method:

If you do this, you may discover there's something you have forgotten.
[ December 12, 2005: Message edited by: Jim Yingst ]
Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44
hmm

The current value of course is: null
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at Transcript.getCourseGrade(Transcript.java:59)
at Transcript.getWorstGradeIndex(Transcript.java:132)
at Student.main(Student.java:250)
The current value of course is: null
The current value of course is: null
The whole transcript for student1

Transcript:

The gpa is NaN

Java for student1 -- null


I put it above and below the (catch) area also, same output.


interesting, that means to me that in my scanner area the variables are being read in but I forgot to assign them to the course object
Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44
btw, the file I am scanning in is:


Java 4 A
Basic 2 C
C++ 3 D
END


so I dont need to use the useDilimeter(" ") do I? I think because of the spaces they're all treated as seperate tokins and just the scanner.next(); should pick them up
Jim Yingst
Wanderer
Sheriff

Joined: Jan 30, 2000
Posts: 18671
[Kevin]: interesting, that means to me that in my scanner area the variables are being read in but I forgot to assign them to the course object

Yep. Also that you've never actually created a Course object.

[Kevin]: so I dont need to use the useDilimeter(" ") do I? I think because of the spaces they're all treated as seperate tokins and just the scanner.next(); should pick them up

Sounds correct. Of course you will want to test this after you've written it to make sure it works, right? But the idea sounds correct.
Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44
this doesn't work, but am I going in the right direction with this?



it says I "cannot convert from string to course"
[ December 12, 2005: Message edited by: Kevin Tansey ]
Jim Yingst
Wanderer
Sheriff

Joined: Jan 30, 2000
Posts: 18671
It looks like you're calling createCourse() from within the createCourse() method. There are times when that makes sense (you will probably study recursion soon) but the way you're doing it seems likely to create an infinite loop. Instead of calling createCourse() from wtihin createCourse(), try constructing an instance of Course, and setting its fields with the data you've obtained from the Scanner.
Jim Yingst
Wanderer
Sheriff

Joined: Jan 30, 2000
Posts: 18671
OK, so now you've edited the post during the time I composed the response. Anyway, my last suggestion still stands.
[ December 12, 2005: Message edited by: Jim Yingst ]
Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44
when you say constructing an instance of Course, do you mean an array?

course = (title + numCredits + grade);

so instead of that I should create something like:




Jim Yingst
Wanderer
Sheriff

Joined: Jan 30, 2000
Posts: 18671
I don't mean an array - I mean a single instance, such as you might create using a constructor. Something like, I dunno, "Course course = new Course();" That's creating an instance using a constructor.

Now I'm assuming there's actually a class called Course somewhere, since you haven't mentioned compilation errors related to Course being undefined. I don't konw what constructors and methods it has. You may want to show the code for that class in order to continue this discussion.
Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44
here's Course



The only problem I see with what you're saying is I was given the declaration of course already as:



so if I try "Course course = new Course();" that is just a duplicate. Everything above the chunks of //comments in the code I've given is instructor provided and not to be changed.
Jim Yingst
Wanderer
Sheriff

Joined: Jan 30, 2000
Posts: 18671
Well, I was assuming that one would simply modify the existing declaration. But if the instructor doesn't want that, OK, don't redeclare the variable course - just set it to a new value, namely the instance you're creating.
Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44
Originally posted by Jim Yingst:
just set it to a new value, namely the instance you're creating.


I'm not following
[ December 12, 2005: Message edited by: Kevin Tansey ]
Jim Yingst
Wanderer
Sheriff

Joined: Jan 30, 2000
Posts: 18671
...


course = new Course();
Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44


Well that certainly looks better.

Having a problem with the course.setGrade line though, its saying

The method setGrade(char) in the type Course is not applicable for the arguments (String)


I tried adding in:

But it didn't take that either, and there is no scanner.nextChar() method either?
Jesper de Jong
Java Cowboy
Saloon Keeper

Joined: Aug 16, 2005
Posts: 14422
    
  23


This is legal Java syntax, but it's uncommon and I would consider it bad style to do an assignment and use the return value of the assignment as the argument of a method call in one line.

Try this.


Java Beginners FAQ - JavaRanch SCJP FAQ - The Java Tutorial - Java SE 8 API documentation
Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44
hmm, ok.

this is how it stands right now:



and it compiles correctly, but I get more warnings now:

"local variable title, numCredits is never read"

and when I run the program this is the output:
Jim Yingst
Wanderer
Sheriff

Joined: Jan 30, 2000
Posts: 18671
Kevin, when someone gives you a bit of new information, please don't just abandon the code you previously had. You still need to create an instance of the Course class using a constructor. You had code that did this a short while ago, but now it's gone. I would offer other hints, but I think you really need to get rid of that NullPointerException, and to understand why it's happening. If you don't set course = new Course(), then course will continue to be null, and you will get a NullPointerException.
Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44
no worries, I know I need help
Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44
oh I have multiple versions of the student.java file saved, I'm not abandoning anything just trying different ideas


playing a little more I'm getting some output finally:



now my worstGradeIndex loop is failing, I was worried about that one.

this is how that method looks, I previously had the loop be a while loop using "worst" as the counter, is that the more correct way to do that loop?



thank you for all of your help
Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44
and yes the nullpointerexception is happening because of this getworstgradeindex loop, -1 is assigned initially to worst and the loop is not changing that value before worst is returned.
Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44
hmm

I wonder whats making the worst grade be null and the GPA to be so far off...



Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44


got the GPA right, I was dividing the QP by the wrong value (course credits instead of the sum of the credits).





now I just need to figure out whats wrong with my worstGradeIndex method
Kevin Tansey
Ranch Hand

Joined: Dec 11, 2005
Posts: 44




and now I can sleep!
 
I agree. Here's the link: http://aspose.com/file-tools
 
subject: Using Scanner to read one line at a time