Рубрики
Java

GWT. Обработка серверных исключений на клиенте.

В целом обработка исключений при работе в GWT через RPC довольно детально описана в разделе документации DevGuideHandlingExceptions

Важный момент на который следуют обратить внимание - throws для метода.

Например, вот Ваш интерфейс:

public interface MyService extends RemoteService {
  public String myMethod(String s);
}

Допустим Вы сделали класс MyException который наследуется от RuntimeException. Например, это исключение вы создали для своих прикладных нужд и хотите чтобы оно могло быть перекинуто и обработано на клиенте.

Это конечно удобно, т.к. полученный тип исключений является Unchecked Exception. Таким образом его не нужно явно декларировать, оно может произойти где угодно (не надо прописывать везде throws) и такое исключение Вы не обязаны явно отлавливать. 

Другими словами,  мы же не пишем для каждого метода throws RuntimeException!

Тем не менее, если где-то у Вас в программе произойдет это исключение:

public class MyServiceImpl extends RemoteServiceServlet implements
    MyService {
 
  public String myMethod(String s) {
    // Do something interesting with 's' here on the server.
    if (isError() ) { throw new MyException("ups");  
    // 
    return s;
  }
}

То это исключение в методе onFailure(Throwable caught) будет передано просто как InvocationException, а не как MyException!
Дело в том, что если заглянуть в реализацию метода обработки вызова RPC-вызовов:

RemoteServiceServlet. processCall() → RPC.invokeAndEncodeResponse() → RPC.encodeResponseForFailure() → RPCServletUtils.isExpectedException()
мы найдем использование следующей конструкции:

Class< ?>[] exceptionsThrown = serviceIntfMethod.getExceptionTypes();

Другими словами, если Вы хотите чтобы Ваше исключение попадало в onFailure(Throwable caught) как MyException, то нужно обязательно декларировать throws, даже если Ваше исключение extends RuntimeException!

В нашем примере это будет выглядеть так:

public interface MyService extends RemoteService {
  public String myMethod(String s) throws MyException;
}

Вот такая вроде мелочь, но если ее не знать, могут возникнуть определенные неудобства.

Рубрики
4. Полезняшки Scala

Читерство в NetBeans. Ввод и использования мат. символов и букв греческого алфавита.

Оригинальная идея взята из поста Gabriel's software development blog. Статья довольно старая, опубликована еще в прошлом году .

Если коротко:

def(x:Double)=Math.sqrt(x)
def(r:Range)(f:Int => Int)=r.foldLeft(0)(_+ f(_))
def(r:Range)(f:Int => Int)=r.foldLeft(1)(_* f(_))
val s=(1 to 100)(x=>(x))

Это обычный Scala код! Выглядит он прикольным, потому что мы используем знакомые всем со школы/института символы. Но как сделать так, чтобы было удобно вводить эти символы для меня было загадкой.

В итоге недавно случайно придумал как это можно сделать просто и удобно средствами IDE, а точнее в NetBeans.

Я вбил все нужные мне символы в Code Templates (Tools → Options → Editor → Code Templates) и сделал два макроса для [Alt+<] = "←" и [Alt+>] = "⇒".

Как это работает можно посмотреть здесь:

То есть вы вводите например alpha и жмете [Tab], в результате в код вставляется α. Самое главное, это настраивается только для нужного языка (в частности Scala), таким образом это не мешает в работе с другими языками. Также если вы хотите написать просто alpha, без преобразования, вы просто НЕ нажимайте [Tab] и всё!

Самое главное! Исходники должны быть в UTF-8 (ну или другой юникодной кодировке)!
P.S.: На самом деле вбивать весь греческий алфавит довольно скучное занятие, можно найти файл вроде этого:

C:\Documents and Settings\<USER_NAME>\.netbeans\6.9\config\Editors\text\x-scala\CodeTemplates\org-netbeans-modules-editor-settings-CustomCodeTemplates.xml

и сгенерить туда все аббревиатуры.

Вот пример моего файла - CustomCodeTemplates.zip. Внимание! Это только пример, возможно он Вам не подойдет.
Будьте аккуратны, перед обновлением сделайте резервную копию!

Рубрики
Java

Практикум по программированию. Занятие №6.

Сегодня провел очередное занятие по Java. 
Чем мы занимались сегодня?

Рубрики
Scala

Магия унарных операторов в Scala (unary_)

Многие знают, что в Scala возможна перегрузка операторов.

К примеру, пусть у нас будет класс - двухмерная точка:

class Point(val x: Double, val y: Double) {
 
  def -(p: Point) = new Point(x-p.x, y-p.y);
  def +(p: Point) = new Point(x+p.x, y+p.y);
 
}

Работать с ней приятно:

   val p1 = new Point(2,2);
   val p2 = new Point(1,1);
   val p = p2 - p1;

Но что делать, если хочется определить унарный минус, т.е. чтобы можно было писать вот так:

   val p = new Point(2,2);
   val antiP = -p;

Конечно, вы можете попробовать сделать так:

    // ТАК ДЕЛАТЬ НЕ НАДО!
    def -() = new Point(-x,-y);

Такой код конечно скомпилируется, но тогда и пользоваться им придется следующим образом:

   val antiP = p-;

Что же делать?

Рубрики
Java Scala

Практикум по программированию на Java и Scala. Занятие №4.

Продолжаю вести практикум по программированию на Java и Scala.

Сегодня было четвертое занятие. Я уже стал многих студентов узнавать в лицо. В среднем на занятия приходит около 25 человек. Аудиторию нам дали хорошую, есть проектор, и вроде неплохие компьютеры. На них уже был установлен Eclipse  или NetBeans.