Difference between revisions of "1188: Bonding"
(fixed case error) |
|||
Line 11: | Line 11: | ||
==Transcript== | ==Transcript== | ||
− | class | + | class Ball extends Throwable {} |
class P{ | class P{ | ||
P target; | P target; | ||
Line 17: | Line 17: | ||
this.target = target; | this.target = target; | ||
} | } | ||
− | void aim ( | + | void aim (Ball ball) { |
try { | try { | ||
throw ball; | throw ball; | ||
} | } | ||
− | catch | + | catch (Ball B) { |
target.aim(B); | target.aim(B); | ||
} | } | ||
Line 29: | Line 29: | ||
P child = new P(parent); | P child = new P(parent); | ||
parent.target = child; | parent.target = child; | ||
− | parent.aim(new | + | parent.aim(new Ball()); |
} | } | ||
} | } |
Revision as of 05:35, 20 March 2013
Bonding |
Title text: I'm trying to build character, but Eclipse is really confusing. |
Explanation
Transcript
class Ball extends Throwable {} class P{ P target; P(P target) { this.target = target; } void aim (Ball ball) { try { throw ball; } catch (Ball B) { target.aim(B); } } public static void main(string[] args) { P parent = new P(null); P child = new P(parent); parent.target = child; parent.aim(new Ball()); } }
Discussion
The aim method results in an infinite loop/stack overflow, note that ball is an exception of type Ball. This results in a logical flow of aim, "throw," "catch," repeat, though this is only logical by word choice, and is nonsensical from a programming perspective. -- 108.48.215.61 (talk) (please sign your comments with ~~~~)
- Just as the game of catch is nonsensical from a logistics perspective! Mumiemonstret (talk) 14:20, 20 March 2015 (UTC)
Pretty sure the code is also intentionally hard to follow. -- 108.48.215.61 (talk) (please sign your comments with ~~~~)
The try/catch parts are just for show, they cancel each other out.
The structure is that you have a parent and a child instance (of class P), each has a 'target' pointed to the other.
Then calling aim with a ball will call the others aim with the ball, which will call the firsts aim with the ball. Etc etc.
I guess after about a 1000 aims the jvm will throw you out, stating stack overflow, and the bonding game is over. -- 212.214.117.162 (talk) (please sign your comments with ~~~~)
Nice catch game :)
I had to test it:
Exception in thread "main" java.lang.StackOverflowError
in my setup with default VM settings after 6612 iterations (I added a static counter variable). The game could get even more "exciting" by using more than two Ps and adding randomization in who is aimed at. And maybe a miss block ;) (need to hack the compiler and VM for that though...) 134.106.146.36 09:31, 20 March 2013 (UTC)
- I don't think any parent will last so long. On the other hand, if you always catch the ball, one iteration doesn't take so long, it's the missing which makes the game long ... -- Hkmaly (talk) 09:56, 20 March 2013 (UTC)
- So true. I start to feel tempted to write a real catch game in Java. Btw: Of course not in Eclipse (please...). I use an IDE where everything works and I don't have to wait all the time. ;) 134.106.146.36 08:15, 21 March 2013 (UTC)
Hmmm "Eclipse: The Codex Persona" is also a d20 gaming system which offers enormous customization of characters. The mention of building character and Eclipse in the same sentence just brought that to the front of my mind. No idea if that has relation to the comic. --50.0.36.182 07:38, 20 March 2013 (UTC)
Did anyone else have a D'AWWWWWW moment when you realized what was happening? I knew it was a pun on throw and catch, but it took till the end for me to realize it was a parent and a child playing catch.74.14.31.164 12:53, 20 March 2013 (UTC)
The one problem with this is that the way the try/catch is set up, they aren't actually throwing to each other. Parent throws the ball, then catches it themselves, then child does the same thing. It's still clever though. Prometheusmmiv (talk) 11:38, 20 March 2013 (UTC)
- I thought exactly the same. Here's a modified version where they actually throw to each other:
class Ball extends Throwable{} class P{ P target; Ball ballInTow; P(P target, Ball ball) { this.target = target; this.ballInTow = ball; } void tease() { try { target.youDontDare(); } catch(Ball b){ ballInTow = b; target.tease(); } } void youDontDare() throws Ball { throw ballInTow; } public static void main(String [] args) { P parent = new P(null, new Ball()); P child = new P(parent, null); parent.target = child; child.tease(); } }
88.9.44.85 15:41, 20 March 2013 (UTC)
- I was thinking about how do this correctly, with the throw bubbling up to the other person. And I realized that in order for the recursion to work, there would have to be a double method where the catcher asks (or "teases") the thrower to throw, then catches it in that method. I was going to write up a version like this, but I had to leave for work. But I'm glad that somebody else was thinking like me and was able to write up a correct version :) Prometheusmmiv (talk) 22:06, 20 March 2013 (UTC)
The code is an odd way of making a loop in Java -- creating two objects (of class P, called "parent" and "child") which repeatedly throw and catch another object (of class Ball) between one another. The sole purpose of this is to create the pun referred to in the title: it's a real-life cliché that a parent and child may "bond" by playing catch. 81.31.112.212 07:14, 20 March 2013 (UTC)
Title text talks about "to build character" in the way usually a father tries to help a child to define "attributes or features that make up and distinguish an individual"[1], so I suppose that the "confusing Eclipse" is a pun itself. Perhaps it is a reference to Eclipse novel by Stephenie Meyer (the kind of book that raises a lot of moral dilemma in a young adult).
--Andcoz (talk) 12:49, 20 March 2013 (UTC)
I think there is another pun in it: The class "Ball" is a child-class of "Throwable" which makes sense because you can throw a ball. But "Throwable" is also the main exception-class from which the real exception classes like "Exception" or "Error" inherit. --DaB. (talk) 12:50, 20 March 2013 (UTC)
I think it's sad that this family always dies in a most unfortunate crash. Here's an alternate ending in which they try just a little bit harder, so they return home for dinner when they're out because they didn't catch the ball:
class Ball extends Throwable {} class P{ P target; P(P target) { this.target = target; } void aim (Ball ball) { try { throw ball; } catch (Ball B) { try { target.aim(B); } catch(Error made) { return; } } } public static void main(String[] args) { P parent = new P(null); P child = new P(parent); parent.target = child; parent.aim(new Ball()); System.out.println("Dinner's ready!"); } }
Jfresen (talk) 14:10, 20 March 2013 (UTC)
Personally, I think Randal missed a trick with the alt text - "My parent tried playing catch with me and all I got was this lousy stack overflow." That said, Eclipse is driving me nuts at the moment, so I can sympathise! --81.187.166.32 22:59, 20 March 2013 (UTC)
- I feel for you. But there is other IDEs out there, where things work, usage and shortcuts are not awkward (depending on what you are used too, of course) and you don't have to wait all the time, if you don't have a Core i7 and SSD... There is hope ;) (and I sometimes have to use Eclipse, too, for the GWT plugin) 134.106.146.36 08:18, 21 March 2013 (UTC)
Maybe "build character" refers to the filename. Since class P was not declared public, the filename could be character.java and things would work. :-) --Divad27182 (talk) 11:49, 21 March 2013 (UTC)
I loved ingenious solution in original code to the "ball to the balls" side effect that is so often seen when teaching catch - 166.147.120.176 12:07, 21 March 2013 (UTC)
- Just to clarify, programmer can't assume that child will inherit "catch" function as intended. That is something they really have to learn for themselves. I wonder if this is how terminator got started? - 166.147.120.148 17:32, 21 March 2013 (UTC)
The code quality remark #4 doesn't seem correct. In Java the constructor will always call the superclass constructor first. If not stated explicitly, it will happen implicitly. So the default empty constructor of Object will actually be called. Is this a misunderstanding, or is the guideline meant to be that the superclass constructor call should always be coded explicitly ? (which is a highly debatable guideline) --141.101.105.234 16:19, 8 January 2015 (UTC)
- There's a lot debatable in those guidelines.
- Good API code needs good javadoc documentation, but this isn't exporting an API, it's a simple self-contained tool, and the code is written to be "readable" which tends to work better than even code documentation (which is always wrong, given enough time).
- Once again, this code describes a self-contained tool, and is nowhere near complex enough to require splitting into packages.
- While it contains good advice (don't expose inner logic and data), it also contains bad advice (getters and setters to access the data - you're back to exposing inner logic and data), and BETTER advice is to prefer immutable data where possible. All of this is moot, because this example doesn't expose anything - the data is package-private, and the main method can access even private members since it's in the same class as the member, and the data member can't be immutable because the parent object needs to be updated after construction to point to the child object.
- As mentioned above, this isn't even advice. In Java you MUST call a super class constructor as the first line in any constructor; omitting any such call implies a call to the super class constructor with no arguments, and is an error if no such constructor exists. Suggesting that you SHOULD call a super class constructor is just misleading - other than being required by the language, why else should you call a super constructor first (as opposed to later?)?
- Don't borrow trouble from the future. A method internal to a class has every right to refer to a member of the same class without qualification, and is usually more readable for it. Using getter methods from within the class simply to wrap access to internal fields is a terrible idea for a couple of reasons, although wrapping access with null-checks or common coersions can simplify the logical flow of your code... but even that is probably better done with utility methods (taking the field as an argument) than member methods (returning some variation on the field).
- New Java developers who happen to come here and see the notes on quality, just note that they aren't notes that point you to GOOD quality.
- 108.162.250.161 02:15, 17 July 2015 (UTC)
The first time I used Eclipse, I couldn't find the run button for my Java applet XD 625571b7-aa66-4f98-ac5c-92464cfb4ed8 (talk) 05:54, 8 March 2017 (UTC)