#    Licensed to the Apache Software Foundation (ASF) under one
#    or more contributor license agreements.  See the NOTICE file
#    distributed with this work for additional information
#    regarding copyright ownership.  The ASF licenses this file
#    to you under the Apache License, Version 2.0 (the
#    "License"); you may not use this file except in compliance
#    with the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing,
#    software distributed under the License is distributed on an
#    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#    KIND, either express or implied.  See the License for the
#    specific language governing permissions and limitations
#    under the License.
Cannot start REPL, see IDE log for more details.
|  Welcome to the Java REPL NetBeans integration
|  Type /help for help

-> System.err.println(""); System.err.println("");
|  Error:
|  illegal start of expression
|  |  Welcome to the Java REPL NetBeans integration
|  ^

-> 
|  Error:
|  illegal start of expression
|  |  Welcome to the Java REPL NetBeans integration
|  ^

-> System.err.println("");
|  Error:
|  ';' expected
|  s integration
|               ^

-> System.err.println("x");
| x

-> System.err.println("ahoj");
| ahoj

-> System
|  Error:
|  cannot find symbol
|    symbol:   variable System
|  System
|  ^----^

-> System.err
|  Expression value is: java.io.PrintStream@3d04a311
|    assigned to temporary variable $3 of type PrintStream

-> System.err.
>> println
|  Error:
|  cannot find symbol
|    symbol:   variable println
|  System.err.
|  ^----------...

-> System.err.

